package com.waikuai.shop.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.waikuai.shop.dto.EmployeeFormDTO;
import com.waikuai.shop.dto.EmployeeQueryDTO;
import com.waikuai.shop.dto.UpdatePasswordDTO;
import com.waikuai.shop.dto.UpdateProfileDTO;
import com.waikuai.shop.dto.UserInfo;
import com.waikuai.shop.entity.User;
import com.waikuai.shop.vo.EmployeeVO;

import java.util.List;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;

/**
 * 用户服务接口
 * @author waikuai
 */
public interface UserService {

    /**
     * 根据用户ID查询用户
     * @param userId 用户ID
     * @return 用户信息
     */
    User findById(Long userId);

    /**
     * 根据用户名查询用户
     * @param username 用户名
     * @return 用户信息
     */
    User findByUsername(String username);

    /**
     * 根据账户查询用户（支持用户名、手机号、邮箱）
     * @param account 账户
     * @return 用户信息
     */
    User findByAccount(String account);

    /**
     * 获取用户详细信息
     * @param userId 用户ID
     * @return 用户详细信息
     */
    UserInfo getUserInfo(Long userId);

    /**
     * 更新用户最后登录信息
     * @param userId 用户ID
     * @param loginIp 登录IP
     */
    void updateLastLoginInfo(Long userId, String loginIp);

    /**
     * 检查用户是否存在
     * @param account 账户
     * @return 是否存在
     */
    boolean existsByAccount(String account);

    // ==================== 员工管理相关方法 ====================

    /**
     * 分页查询员工列表
     * @param queryDTO 查询条件
     * @return 员工分页列表
     */
    IPage<EmployeeVO> getEmployeePage(EmployeeQueryDTO queryDTO);

    /**
     * 根据ID获取员工详情
     * @param id 员工ID
     * @return 员工详情
     */
    EmployeeVO getEmployeeById(Long id);

    /**
     * 新增员工
     * @param formDTO 员工表单
     */
    void addEmployee(EmployeeFormDTO formDTO);

    /**
     * 更新员工信息
     * @param formDTO 员工表单
     */
    void updateEmployee(EmployeeFormDTO formDTO);

    /**
     * 删除员工（逻辑删除）
     * @param id 员工ID
     */
    void deleteEmployee(Long id);

    /**
     * 批量删除员工
     * @param ids 员工ID列表
     */
    void batchDeleteEmployees(List<Long> ids);

    /**
     * 更新员工账号状态
     * @param id 员工ID
     * @param status 状态（0-禁用，1-启用）
     */
    void updateEmployeeStatus(Long id, Integer status);

    /**
     * 批量更新员工账号状态
     * @param ids 员工ID列表
     * @param status 状态（0-禁用，1-启用）
     */
    void batchUpdateEmployeeStatus(List<Long> ids, Integer status);

    /**
     * 重置员工密码
     * @param id 员工ID
     * @return 新密码
     */
    String resetEmployeePassword(Long id);

    /**
     * 获取所有部门列表
     * @return 部门列表
     */
    List<String> getAllDepartments();

    // ==================== 个人信息管理相关方法 ====================

    /**
     * 获取当前用户信息
     * @param userId 用户ID
     * @return 用户信息
     */
    EmployeeVO getMyProfile(Long userId);

    /**
     * 更新个人信息
     * @param dto 个人信息更新DTO
     * @param userId 用户ID
     */
    void updateMyProfile(UpdateProfileDTO dto, Long userId);

    /**
     * 修改密码
     * @param dto 密码修改DTO
     * @param userId 用户ID
     */
    void updateMyPassword(UpdatePasswordDTO dto, Long userId);
    
    /**
     * 修改支付密码
     * @param dto 支付密码修改DTO
     * @param userId 用户ID
     */
    void updateMyPaymentPassword(com.waikuai.shop.dto.UpdatePaymentPasswordDTO dto, Long userId);
    
    /**
     * 上传头像
     * @param file 头像文件
     * @param userId 用户ID
     * @return 头像URL
     */
    String uploadAvatar(MultipartFile file, Long userId);

    // ==================== Excel导入相关方法 ====================

    /**
     * 导入员工Excel
     * @param file Excel文件
     * @return 导入结果
     */
    com.waikuai.shop.vo.ImportResultVO importEmployees(MultipartFile file);

    /**
     * 下载Excel模板
     * @param response HTTP响应
     */
    void downloadTemplate(HttpServletResponse response);

    /**
     * 导出员工数据到Excel
     * @param queryDTO 查询条件
     * @param response HTTP响应
     */
    void exportEmployees(EmployeeQueryDTO queryDTO, HttpServletResponse response);
}